package com.husd.leetcode.bit;

/**
 * 面试题 05.07. 配对交换
 * <p>
 * 配对交换。编写程序，交换某个整数的奇数位和偶数位，尽量使用较少的指令（也就是说，位0与位1交换，位2与位3交换，以此类推）。
 * <p>
 * 示例1:
 * <p>
 * 输入：num = 2（或者0b10）
 * 输出 1 (或者 0b01)
 * 示例2:
 * <p>
 * 输入：num = 3
 * 输出：3
 * 提示:
 * <p>
 * num的范围在[0, 2^30 - 1]之间，不会发生整数溢出。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/exchange-lcci
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author hushengdong
 */
public class ExchangeBits {

    //思路是什么？ 转成字符串，就失去了位的意义
    //
    //001010101010
    //000101010101
    // 00 不需要交换
    // 11 不需要交换
    // 10 需要交换
    // 01 需要交换

    //上面这个思路不行
    //分别取出奇数位和偶数位，移动后做或运算。
    //题目规定 num 是int范围的数
    //0x55555555 = 0b0101_0101_0101_0101_0101_0101_0101_0101
    //0xaaaaaaaa = 0b1010_1010_1010_1010_1010_1010_1010_1010
    // 根据这2个值，可以提取出num的奇数位和偶数位
    public int exchangeBits(int num) {

        //
        int a = num & 0x55555555;
        int b = num & 0xaaaaaaaa;
        return (a << 1) | (b >>> 1);
    }
}
